package com.youjia.center.boot.data.mp.basic.service;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.youjia.center.boot.data.mp.basic.dto.PagedListDto;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * 由entity向dto转换的dao层service
 * @param <T> dto
 * @param <E> entity
 */
public interface IBaseService<T,E> extends IService<E> {

    /**
     * 保存dto对象
     * @param t dto
     * @return dto
     */
    T saveDTO(T t);

    /**
     * 保存或者修改dto对象
     * @param t dto
     * @return dto
     */
    T saveOrUpdateDTO(T t);

    /**
     * 保存或者修改dto对象
     * @param t dto
     * @param updateWrapper updateWrapper
     * @return dto
     */
    T saveOrUpdateDTO(T t, Wrapper<E> updateWrapper);

    /**
     * 批量保存dto
     * @param dtoCollection dto集合
     * @param batchSize 批量提交数量
     * @return 是否成功
     */
    boolean batchSaveDTO(Collection<T> dtoCollection, int batchSize);

    /**
     * 批量保存或者修改dto
     * @param dtoCollection dto集合
     * @param batchSize 批量提交数量
     * @return 是否成功
     */
    boolean batchSaveOrUpdateDTO(Collection<T> dtoCollection,int batchSize);

    /**
     * 批量删除dto
     * @param dtoCollection dto集合
     * @param batchSize 批量提交数量
     * @return 是否成功
     */
    boolean batchRemoveDTOByIds(Collection<T> dtoCollection, int batchSize);

    /**
     * 根据id数组进行删除
     * @param dtoCollection dto集合
     * @return 是否成功
     */
    boolean removeDTOByIds(Collection<T> dtoCollection);

    /**
     * 查询全部dto
     * @return dto集合
     */
    @Deprecated
    List<T> selectDTOList();

    /**
     * 根据主键集合查询列表
     * @param idList 主键集合
     * @return dto集合
     */
    List<T> selectDTOListByIds(Collection<? extends Serializable> idList);

    /**
     * 根据map查询dto集合(参数为驼峰风格名称-自动转换为下划线)
     * @param columnMap 查询map
     * @return dto集合
     */
    List<T> selectDTOListByMap(Map<String, Object> columnMap);

    /**
     * 根据map查询dto(参数为驼峰风格名称-自动转换为下划线)
     * @param columnMap 查询map
     * @return dto
     */
    T selectDtoOneByMap(Map<String, Object> columnMap);

    /**
     * 根据long类型主键查询dto
     * @param id long类型主键
     * @return dto
     */
    T selectDtoOneById(Long id);

    /**
     * 根据String类型主键查询dto
     * @param uuid String类型主键
     * @return dto
     */
    T selectDtoOneById(String uuid);

    /**
     * 根据wrapper查询dto集合
     * @param queryWrapper wrapper
     * @return dto list
     */
    List<T> selectDTOListByWrapper(Wrapper<E> queryWrapper);

    /**
     * 根据wrapper查询dto
     * @param queryWrapper wrapper
     * @return dto
     */
    T selectDtoOneByWrapper(Wrapper<E> queryWrapper);

    /**
     * 分页查询dto
     * @param columnMap 查询map
     * @return Page {@link Page<T>}
     */
    PagedListDto<T> pageListByMap(Map<String, Object> columnMap);

    /**
     * 分页查询dto
     * @param queryWrapper 查询wrapper
     * @param pageIndex 1 开始
     * @param pageSize 大于0
     * @return Page {@link Page<T>}
     */
    PagedListDto<T> pageListByWrapper(Wrapper<E> queryWrapper, int pageIndex, int pageSize);

}
